0932a582670f86699c242ebab85fbdcfc34f8a9f,cdi-microservice-provider/src/main/java/io/silverware/microservices/providers/cdi/CdiMicroserviceProvider.java,CdiMicroserviceProvider,lookupMicroservice,#MicroserviceMetaData#,106

Before Change


               return Collections.singleton(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
            } else if (type.isInterface() && !name.equals(theBean.getName())) {
               if (qualifiers.stream().filter(q -> q.annotationType().getName().equals("Default")).count() == 0) { // we have a qualifier match
                  return Collections.singleton(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
               }
            }
         }

After Change


      final Class<?> type = microserviceMetaData.getType();
      final Set<Annotation> qualifiers = microserviceMetaData.getQualifiers();
      final Set<Object> matchingBeansByName = new HashSet<>();
      final Set<Object> matchingBeansByType = new HashSet<>();

      /*
         We are in search for a CDI bean that meets the provided meta-data.
         Input and corresponding output is as follows:
           * name specified in MicroserviceReference or derived from data type (both class or interface)
                 * beans having the same name in Microservice annotation
                 * beans having the same name according to CDI
           * the injection point is interface and name matches interface type name
                 * beans implementing the interface and matching the qualifiers
         In all cases, there must be precisely one result or an error is thrown.
       */

      final BeanManager beanManager = ((BeanManager) context.getProperties().get(BEAN_MANAGER));
      Set<Bean<?>> beans = beanManager.getBeans(type, qualifiers.toArray(new Annotation[qualifiers.size()]));
      for (Bean<?> bean : beans) {
         if (bean.getBeanClass().isAnnotationPresent(Microservice.class) && !(bean instanceof MicroserviceProxyBean)) {
            final Bean<?> theBean = beanManager.resolve(Collections.singleton(bean));
            final Microservice microserviceAnnotation = theBean.getBeanClass().getAnnotation(Microservice.class);

            if (name != null) {
               if ((!microserviceAnnotation.value().isEmpty() && name.equals(microserviceAnnotation.value())) ||
                     (microserviceAnnotation.value().isEmpty() && name.equals(theBean.getName()))) {
                  matchingBeansByName.add(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
               } else if (type.isAssignableFrom(theBean.getBeanClass())) {
                  final Set<Annotation> qualifiersToCompare = new HashSet<>(theBean.getQualifiers());
                  qualifiers.stream().forEach(qualifiersToCompare::remove);

                  if (qualifiersToCompare.size() == 0) {
                     matchingBeansByType.add(beanManager.getReference(theBean, type, beanManager.createCreationalContext(theBean)));
                  }
               }
            }